﻿using Hwh_VoteSys.Models.Database;
using Hwh_VoteSys.Models.User;
using Hwh_VoteSys.Service;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;

namespace Hwh_VoteSys.Controllers
{
	/// <summary>
	/// 用户模块
	/// </summary>
	[Route("api/[controller]/[action]")]
	[ApiController]
	public class UserController : Controller
	{
		//                     类型     变量名
		// 私有 只读（它仅可以在构造函数里赋值，赋值后不能修改）  int a
		private readonly Hwh_VoteSysContext _db;
		private readonly IJWTService _jwtService;

		/// <summary>
		/// 构造函数（UserController类初始化第一个访问的函数）
		/// 从IOC容器（管理对象的容器）获取db对象（Hwh_VoteSysContext类型）
		/// </summary>
		/// <param name="db"></param>
		/// <param name="jwtService"></param>
		public UserController(Hwh_VoteSysContext db, IJWTService jwtService)
		{
			_db = db;
			_jwtService = jwtService;
		}

		//MD5 算法
		//转换 单向转换
		//把一切（1~无限）字符串 转换成32位字符串
		//密码/书籍/文件

		//撞库(MD5原理)
		//拿被破解用户表 去撞 其他系统的数据库

		//Salt 盐值 随机字符串 每个用户不一样的随机字符串

		//用户注册接口  输入邮箱，密码 输出：注册成功或失败消息
		/// <summary>
		/// 用户注册接口
		/// 用户类型 （普通用户、企业用户）
		/// </summary>
		/// <param name="request"></param>
		/// <returns></returns>
		[HttpPost]
		public string AddUser(AddUserRequest request)
		{
			//接口具体实现
			//二次密码验证
			if (request.Password != request.cifrgPassword)
			{
				return "两次密码不一致";
			}
			//邮箱是否已经注册,邮箱不能重复
			if (_db.Users.Any(x => x.UEmail == request.Email))
			{
				return "邮箱已经注册";
			}

			//定义盐值	100000~999999 6位随机数字符串
			var salt = new Random().Next(100000, 999999).ToString();
			//                                 "123456"+"565644"
			//                                  即使密码相同 因为盐值是随机的 所以加密的结果是不一致的
			//定义MD5加密后的密码
			var md5Password = MD5Helper.MD5Encrypt32(request.Password + salt);

			//添加一个新的用户
			var user = new User
			{
				UName = request.UName,
				UEmail = request.Email,
				Password = md5Password,
				UserType = request.UserType,
				Salt = salt,
				CreateTime = DateTime.Now
			};

			//添加到数据库
			_db.Users.Add(user);
			//保存更改 增加 修改 删除
			var row = _db.SaveChanges();
			if (row > 0)
				return "注册成功";
			return "注册失败";
		}

		//用户登录接口（邮箱，密码进行登录，登录后可访问需要授权的页面）
		//输入：邮箱，密码 输出：登录成功返回token,失败提示消息
		/// <summary>
		/// 用户登录接口
		/// </summary>
		/// <param name="request"></param>
		/// <returns></returns>
		[HttpPost]
		public string Login(LoginRequest request)
		{
			//接口具体实现
			//查询数据库邮箱为输入邮箱的用户
			var user = _db.Users.FirstOrDefault(x => x.UEmail == request.Email);
			if (user == null)
			{
				return "用户不存在";
			}
			//如果用户存在，验证密码是否正确
			//  '123456789'								123456789
			var md5Password = MD5Helper.MD5Encrypt32(request.Password + user.Salt);
			if (md5Password != user.Password)
			{
				return "密码错误";
			}

			//创建token
			return "登陆成功：" + "您的token：" + _jwtService.CreateToken(user.UId, user.UName,user.UEmail);
		}
	}
}
